// todo: 屏幕适配工具，提供屏幕尺寸与字体的适配处理。 响应式屏幕
import 'package:flutter/material.dart';

//* 屏幕适配工具，提供屏幕尺寸与字体的适配处理
class ScreenUtils {
  // 屏幕宽度和高度
  static late double screenWidth;
  static late double screenHeight;

  /// 初始化屏幕宽高信息 (在应用入口处调用)
  static void init(BuildContext context) {
    final size = MediaQuery.of(context).size;
    screenWidth = size.width;
    screenHeight = size.height;
  }

  static Size getSize(BuildContext context) {
    final size = MediaQuery.of(context).size;
    return size;
  }

  /// 按比例适配宽度 (基于设计基准宽度 375)
  static double adaptWidth(double width) {
    return (width / 375.0) * screenWidth;
  }

  /// 按比例适配高度 (基于设计基准高度 812)
  static double adaptHeight(double height) {
    return (height / 812.0) * screenHeight;
  }

  /// 按比例适配字体大小 (默认基于宽度缩放)
  static double adaptFontSize(double fontSize) {
    return adaptWidth(fontSize);
  }

  /// 获取屏幕宽度 (便捷方法)
  static double getWidth(BuildContext context) {
    return MediaQuery.of(context).size.width;
  }

  /// 获取屏幕高度 (便捷方法)
  static double getHeight(BuildContext context) {
    return MediaQuery.of(context).size.height;
  }

  /// 字体缩放 (基于设备字体缩放设置) , size传参和dimens 结合使用
  static double scaleFont(BuildContext context, double fontSize) {
    return MediaQuery.of(context).textScaler.scale(fontSize);
  }

  /// 大小缩放 (基于屏幕宽度比例缩放)
  static double scaleSize(BuildContext context, double size) {
    final double scale =
        MediaQuery.of(context).size.width / 375.0; // 基于设计宽度 375
    return size * scale;
  }
}

// * 统一的响应式工具类，提供基于网格单位的布局适配
class Responsive {
  /// 获取网格单元大小 (基于最小屏幕维度，划分为 24 单元)
  static double gridUnit(BuildContext context) {
    final double screenHeight = MediaQuery.of(context).size.height;
    final double screenWidth = MediaQuery.of(context).size.width;

    // 选择较小的屏幕维度作为网格单位基准
    final double baseSize =
        screenHeight > screenWidth ? screenWidth : screenHeight;

    return baseSize / 24;
  }

  /// 获取高度单元 (网格单位的倍数)
  static double heightUnits(BuildContext context, int units) {
    return gridUnit(context) * units;
  }

  /// 获取宽度单元 (网格单位的倍数)
  static double widthUnits(BuildContext context, int units) {
    return gridUnit(context) * units;
  }
}

/// 扩展 MediaQueryData 的功能，提供字体缩放限制
extension MediaQueryDataExtension on MediaQueryData {
  /// 限制字体缩放的最大倍数 (避免缩放过大导致布局问题)
  TextScaler get clampedTextScaler => textScaler.clamp(maxScaleFactor: 1.2);
}
